home *** CD-ROM | disk | FTP | other *** search
/ Game.EXE 2001 January / Game.EXE_01_2001.iso / demos / Blade of Darkness / data1.cab / Program_Executable_Files / Lib / Basic_Funcs.py < prev    next >
Encoding:
Python Source  |  2000-11-16  |  33.3 KB  |  1,026 lines

  1. #
  2. #
  3. # Basic funcions that are launch trough the code
  4. # Both for the main player/s AND the Non Playing Characters !
  5. #
  6. #
  7.  
  8. import Bladex
  9. import AuxTran
  10. import Actions
  11. import Blood
  12. import Damage
  13. import AniSound
  14. import Reference
  15. import pdb
  16. import CharStats
  17. import copy
  18. import ItemTypes
  19. import netgame
  20. import whrandom
  21. import MenuText
  22. import AuxFuncs
  23. import GenFX
  24. import Auras
  25. import ObjStore
  26. import GameStateAux
  27. import BInput
  28. import InitDataField
  29. import CombosFX
  30.  
  31.  
  32. new_combo_sound = Bladex.CreateSound('..\\..\\Sounds\\sesgado-lava.wav', 'NewComboSound')
  33. new_combo_sound.Volume=1.0
  34. new_combo_sound.MinDistance=5000
  35. new_combo_sound.MaxDistance=20000
  36.  
  37. # Useful general functions
  38.  
  39. ############################  Energy Functions  ############################
  40.  
  41. RestoreEnergyTime= 1.0/20.0
  42. EnergyMin= 14.0
  43. #RestoreEnergyRateMin= 0.005*EnergyMin
  44. #RestoreEnergyRateMin= 0.095*EnergyMin
  45. #RestoreEnergyRateMax= 0.095*EnergyMin
  46. RestoreEnergyRateMin= 0.005
  47. RestoreEnergyRateMax= 0.095
  48.  
  49. def RestoreEnergyFunc(EntityName):
  50.     Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(EntityName,),"PlayerRestoreEnergy")
  51.     pj=Bladex.GetEntity(EntityName)
  52.     if pj:
  53.         max_energy= CharStats.GetCharMaxEnergy(pj.Kind, pj.Level)
  54.         prev_energy= pj.Energy
  55.         if pj.InAttack:
  56.             energy2lose= min (pj.Data.LoseEnergyRate*RestoreEnergyTime, pj.Data.Energy2Lose)
  57.             pj.Energy= max(prev_energy-energy2lose, -max_energy*Reference.ENERGY_LOW_LEVEL)
  58.             pj.Data.Energy2Lose= pj.Data.Energy2Lose-energy2lose
  59.             if pj.Energy<=0.0 and pj.AnmPos>0.8:
  60.                 pj.Gof=0
  61.                 pj.Gob=0
  62.                 pj.Tl=0
  63.                 pj.Tr=0
  64.                 pj.InterruptCombat()
  65.                 pj.RaiseEvent("Interrupt")
  66.             
  67.             """
  68.             if pj.Energy<=0.0 and not prev_energy<=0.0 and pj.AnimName!='Rlx_vt':
  69.                 #pj.DoActionWI("Rlx_vt",  0, 0.65, 0.0)
  70.                 pj.Gof=0
  71.                 pj.Gob=0
  72.                 pj.Tl=0
  73.                 pj.Tr=0
  74.                 
  75.                 pj.LaunchAnmType("Rlx_vt")
  76.             """
  77.         else:
  78.             energyF= pow(1.0-(pj.Level/(CharStats.GetMaxLevel()*1.0)), 2)
  79.             RestoreEnergyRate= energyF*(RestoreEnergyRateMax-RestoreEnergyRateMin)+RestoreEnergyRateMin
  80.             new_energy= max(min((prev_energy+RestoreEnergyRate*max_energy)-pj.Data.Energy2Lose, max_energy),-max_energy*Reference.ENERGY_LOW_LEVEL)
  81.             
  82.             
  83.             pj.Energy= new_energy
  84.             pj.Data.Energy2Lose= 0.0
  85.             """
  86.             if (new_energy/max_energy) > Reference.ENERGY_LOW_LEVEL and pj.AnimName=='Rlx_vt':
  87.                 pj.InterruptCombat()
  88.                 pj.Attack=0
  89.                 pj.RaiseEvent("Recover")
  90.             """
  91.  
  92.  
  93. ############################                 ############################
  94.  
  95.  
  96. # Define the base python person class
  97. class PlayerPerson:
  98.  
  99.     ObjId=0
  100.     NPC = 0
  101.     Name = "Unnamed"
  102.     DamageFactorNone  = -0.001
  103.     DamageFactorLight = 0.1
  104.     DamageFactorHeavy = 0.35
  105.     TakeBleedingImpact= 0
  106.     ThrownBy= None
  107.     PowerPotion = 0
  108.     FAttack = 1.0
  109.     FDefense = 1.0
  110.     AimPressed= 0
  111.     stuff_onback_b4= 0
  112.     toggle4t_clearback= 0
  113.     LoseEnergyRate= 0.0    
  114.     Energy2Lose= 0.0
  115.     last_frwdup=-1
  116.     last_brwdup=-1
  117.     armour_level=0
  118.     armour_prot_factor=0
  119.     Poisoned=0
  120.     NoFXOnHit= 1    
  121.     Resistances=None    
  122.     ObjectsTaken= []
  123.     LevelUpParticleData=[]
  124.     Invincibility= 0
  125.     InventoryActive=1
  126.     LastDamageType=""
  127.  
  128.     def __init__(self, me):
  129.  
  130.         self.inheritance = 0
  131.         self.InventoryActive = me.Name[0:6] != "Player"
  132.         self.ObjId=ObjStore.GetNewId() # Para identificarlo al grabar/guardar
  133.         ObjStore.ObjectsStore[self.ObjId]=self
  134.  
  135.         self.ObjectsTaken= []
  136.         self.LevelUpParticleData=[]
  137.         #_________________________________________#
  138.         #  Record some personal data              #
  139.         #_________________________________________#        
  140.  
  141.         self.Name = me.Name
  142.  
  143.         #_________________________________________#
  144.         # Set up the core functions               #
  145.         #_________________________________________#
  146.         me.DamageFunc = Damage.CalculateDamage
  147.         me.AttackFunc= Damage.CalculateFatigue
  148.         me.TakeFunc = self.TakeFunc
  149.         me.ThrowFunc = self.ThrowFunc
  150.         me.HitFunc = self.HitFunc
  151.         me.ImDeadFunc = self.PCImDead
  152.         me.NewComboFunc=self.StdNewCombo
  153.         me.BigFallFunc=self.StdBigFall
  154.         #me.ToggleCombatFunc=self.StdToggleCombat
  155.  
  156.         me.Life= CharStats.GetCharMaxLife(me.Kind, me.Level)
  157.         me.Energy= CharStats.GetCharMaxEnergy(me.Kind, me.Level)
  158.  
  159.         #_________________________________________#
  160.         # Initialise core                         #
  161.         #_________________________________________#        
  162.         me.AddAnmEventFunc("TakeArrow", Actions.TakeArrowEventHandler)
  163.         me.AddAnmEventFunc("CheckRefireBow", Actions.CheckRefireBowEventHandler)
  164.  
  165.         me.AddAnmEventFunc("W2hToLeft", Actions.W2hToLeftHandler)
  166.         me.AddAnmEventFunc("W2hToRight", Actions.W2hToRightHandler)
  167.         me.AddAnmEventFunc("LaunchTrail", self.LaunchTrail)
  168.  
  169.         me.AddAnmEventFunc("Start_Weapon", Actions.Start_Weapon)
  170.         me.AddAnmEventFunc("Stop_Weapon", Actions.Stop_Weapon)
  171.         me.AddAnmEventFunc("Start_Trail", Actions.Start_Trail)
  172.         me.AddAnmEventFunc("Stop_Trail", Actions.Stop_Trail)
  173.         me.AddAnmEventFunc("GraspString", Actions.GraspString)
  174.         me.AddAnmEventFunc("UnGraspString", Actions.UnGraspString)
  175.         me.AddAnmEventFunc("Start_Weapon_Special", Actions.Start_Weapon_Special)
  176.         me.AddAnmEventFunc("Stop_Weapon_Special", Actions.Stop_Weapon_Special)
  177.         me.AddAnmEventFunc("ElevatorDeath", Actions.QuickDeath)
  178.  
  179.         if me.CharTypeExt in ("Kgt", "Bar", "Amz", "Dwf"):
  180.             exec_string="CombosFX."+me.CharTypeExt+"CombosFX(me.Name)"
  181.             print "asignando funciones a eventos para FX..."
  182.             print exec_string
  183.             exec(exec_string)
  184.  
  185.         me.MutilateFunc= self.MutilateFunc
  186.         inv = me.GetInventory()
  187.         inv.maxObjects = 15
  188.  
  189.         self.Resistances= copy.copy(CharStats.GetCharResistances(me.Kind))
  190.         self.ResetSounds(self.Name)
  191.  
  192.         ##### Energy Fuctions ####
  193.         if self.Name[0:6] == "Player":
  194.             self.LevelUpParticleData=[]
  195.             for i in range(30):
  196.                 if i>25:
  197.                     traux=(30.0-i)/5.0 #va de 0 a 1
  198.                     aux=traux**0.5
  199.                 else:
  200.                     traux=i/25.0 #va de 1 a 0
  201.                     aux=traux**2.0
  202.                 r=255
  203.                 g=255
  204.                 b=255
  205.                 a=255.0*traux
  206.                 size=200.0*aux
  207.                 self.LevelUpParticleData.append(a)
  208.                 self.LevelUpParticleData.append(size)
  209.                 Bladex.SetParticleGVal("LevelUpParticle",i,r,g,b,a,size)
  210.             Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(self.Name,),"PlayerRestoreEnergy")
  211.  
  212.  
  213.     def __del__(self):
  214.         del ObjStore.ObjectsStore[self.ObjId]
  215.  
  216.  
  217.     def ResetSounds(self, EntityName):
  218.         me=Bladex.GetEntity(EntityName)
  219.         kind=me.Kind[:len(me.Kind)-2]
  220.         if kind=="Barbarian":
  221.             AniSound.AsignarSonidosBarbaro(EntityName)
  222.         elif kind=="Knight":
  223.             AniSound.AsignarSonidosCaballero(EntityName)
  224.         elif kind=="Dwarf":
  225.             AniSound.AsignarSonidosEnano(EntityName)
  226.         elif kind=="Amazon":
  227.             AniSound.AsignarSonidosAmazona(EntityName)
  228.  
  229.     def GetNewMembers(self):
  230.         bases=self.__class__.__bases__
  231.         new_members={}
  232.         for i in bases:
  233.             base_dict=i.__dict__
  234.             for j in base_dict.keys():
  235.                 if type(base_dict[j])==types.IntType:
  236.                     new_members[j]=base_dict[j]
  237.  
  238.  
  239.     def persistent_id(self):
  240.         return self.ObjId
  241.  
  242.     def __save_core_funcs__(self):
  243.         me = Bladex.GetEntity(self.Name)
  244.         if not me:
  245.             print "__save_core_funcs__() Warning: trying to save a non existent entity",self.Name
  246.             return
  247.  
  248.         core_funcs = []
  249.         j = 0
  250.  
  251.         funcs =[("DamageFunc",            Damage.CalculateDamage),
  252.                 ("AttackFunc",            Damage.CalculateFatigue),
  253.                 ("TakeFunc",              self.TakeFunc),
  254.                 ("ThrowFunc",             self.ThrowFunc),
  255.                 ("HitFunc",               self.HitFunc),    
  256.                 ("NewComboFunc",          self.StdNewCombo),
  257.                 ("BigFallFunc",           self.StdBigFall)]
  258.  
  259.         for i in funcs:
  260.             exec('f = me.'+i[0])
  261.             if (i[1] <> f):
  262.                 print "Save Core Func para",me.Name," callback ",i[0]," funcion ", f
  263.                 core_funcs.append((j,GameStateAux.SaveFunctionAux(f)))
  264.             j = j + 1
  265.  
  266.         if (self.inheritance <> 1):
  267.             funcs2=["SeeFunc",
  268.                     "HearFunc",
  269.                     "DelayNoSeenFunc",
  270.                     "NoAllowedAreaFunc",
  271.                     "EnemyNoAllowedAreaFunc",
  272.                     "ImHurtFunc",
  273.                     "EnemyDeadFunc",
  274.                     "AnmEndedFunc",
  275.                     "EnterCloseFunc",
  276.                     "EnterLargeFunc",
  277.                     "EnterPrimaryAAFunc",
  278.                     "EnterSecondaryAAFunc",
  279.                     "CharSeeingEnemyFunc",
  280.                     "ToggleCombatFunc"]
  281.  
  282.             for i in funcs2:
  283.                 exec('f = me.'+i)
  284.                 if (f <> None):
  285.                     print "Save Core Func para",me.Name," callback ",i," funcion ", f
  286.                     core_funcs.append((j,GameStateAux.SaveFunctionAux(f)))
  287.                 j = j + 1
  288.  
  289.             if me.ImDeadFunc <> self.PCImDead:
  290.                 core_funcs.append((j,GameStateAux.SaveFunctionAux(f)))
  291.  
  292.  
  293.         return(core_funcs)
  294.  
  295.     def __load_core_funcs__(self,param):
  296.         me = Bladex.GetEntity(self.Name)
  297.         if not me:
  298.             print "__load_core_funcs__ -> Warning, trying to get a non existent entity",self.Name
  299.             return
  300.         
  301.         funcs=[ "DamageFunc",
  302.                 "AttackFunc",
  303.                 "TakeFunc",
  304.                 "ThrowFunc",
  305.                 "HitFunc",
  306.                 "NewComboFunc",
  307.                 "BigFallFunc",
  308.                 "SeeFunc",
  309.                 "HearFunc",
  310.                 "DelayNoSeenFunc",
  311.                 "NoAllowedAreaFunc",
  312.                 "EnemyNoAllowedAreaFunc",
  313.                 "ImHurtFunc",
  314.                 "EnemyDeadFunc",
  315.                 "AnmEndedFunc",
  316.                 "EnterCloseFunc",
  317.                 "EnterLargeFunc",
  318.                 "EnterPrimaryAAFunc",
  319.                 "EnterSecondaryAAFunc",
  320.                 "CharSeeingEnemyFunc",
  321.                 "ToggleCombatFunc",
  322.                 "ImDeadFunc"]
  323.  
  324.         for i in param:
  325.             print "Load Core Func ",i[1]," para ",me.Name," funcion ",funcs[i[0]]
  326.             try:
  327.                 GameStateAux.LoadFunctionAux(i[1],me,funcs[i[0]])
  328.                 print "Loaded for entity"
  329.             except:
  330.                 GameStateAux.LoadFunctionAux(i[1],self,funcs[i[0]])
  331.                 exec("me.%s=self.%s"%(funcs[i[0]],funcs[i[0]]))
  332.  
  333.     def __getstate__(self):
  334.         # Tiene que devolver c≤mo poder guardar el estado de la clase
  335.  
  336.         return (1,{"PlayerPerson":(self.ObjId,
  337.                                    self.NPC,
  338.                                    self.Name,
  339.                                    self.DamageFactorNone,
  340.                                    self.DamageFactorLight,
  341.                                    self.DamageFactorHeavy,
  342.                                    self.TakeBleedingImpact,
  343.                                    self.ThrownBy,
  344.                                    self.PowerPotion,
  345.                                    self.FAttack,
  346.                                    self.FDefense,
  347.                                    self.AimPressed,
  348.                                    self.stuff_onback_b4,
  349.                                    self.toggle4t_clearback,
  350.                                    self.last_frwdup,
  351.                                    self.last_brwdup,
  352.                                    self.LoseEnergyRate,
  353.                                    self.Energy2Lose,
  354.                                    self.Resistances,
  355.                                    self.armour_level,
  356.                                    self.armour_prot_factor,
  357.                                    self.Poisoned,
  358.                                    self.ObjectsTaken,
  359.                                    self.Invincibility,
  360.                                    self.InventoryActive,
  361.                                    self.LastDamageType,
  362.                                    GameStateAux.SaveNewMembers(self),
  363.                                    PlayerPerson.__save_core_funcs__(self))
  364.                    }
  365.                 )
  366.  
  367.     def persistent_check(self):
  368.         me=Bladex.GetEntity(self.Name)
  369.         if not me:
  370.             return 0
  371.         return 1
  372.  
  373.     def __setstate__(self,parm):
  374.         # Toma como parßmetro lo que devuelve __getstate__() y debe recrear la clase
  375.         version=parm[0]
  376.  
  377.  
  378.         if version==1:
  379.             parms=parm[1]["PlayerPerson"]
  380.             self.ObjId=parms[0]
  381.             ObjStore.ObjectsStore[self.ObjId]=self
  382.             self.NPC=parms[1]
  383.             self.Name=parms[2]
  384.             me=Bladex.GetEntity(self.Name)
  385.  
  386.             #_________________________________________#
  387.             # Set up the core functions               #
  388.             #_________________________________________#
  389.             me.DamageFunc = Damage.CalculateDamage
  390.             me.TakeFunc = self.TakeFunc
  391.             me.ThrowFunc = self.ThrowFunc
  392.             me.HitFunc = self.HitFunc
  393.             me.ImDeadFunc = self.PCImDead
  394.             me.NewComboFunc=self.StdNewCombo
  395.             me.BigFallFunc=self.StdBigFall
  396.             me.AttackFunc= Damage.CalculateFatigue
  397.  
  398.             self.DamageFactorNone=parms[3]
  399.             self.DamageFactorLight=parms[4]
  400.             self.DamageFactorHeavy=parms[5]
  401.             self.TakeBleedingImpact=parms[6]
  402.             self.ThrownBy=parms[7]
  403.             self.PowerPotion=parms[8]
  404.             self.FAttack=parms[9]
  405.             self.FDefense=parms[10]
  406.             self.AimPressed=parms[11]
  407.             self.stuff_onback_b4=parms[12]
  408.             self.toggle4t_clearback=parms[13]
  409.             self.last_frwdup=parms[14]
  410.             self.last_brwdup=parms[15]
  411.             self.LoseEnergyRate=parms[16]
  412.             self.Energy2Lose=parms[17]
  413.             self.Resistances=parms[18]
  414.             self.armour_level=parms[19]
  415.             self.armour_prot_factor=parms[20]
  416.             self.Poisoned=parms[21]
  417.             self.ObjectsTaken=parms[22]
  418.             self.Invincibility=parms[23]
  419.             self.InventoryActive=parms[24]
  420.             self.LastDamageType=parms[25]
  421.             GameStateAux.LoadNewMembers(self,parms[26])
  422.             PlayerPerson.__load_core_funcs__(self,parms[27])
  423.             
  424.         else:
  425.             print "ERROR, Incorrect version"
  426.             self.ObjId=ObjStore.GetNewId()
  427.             ObjStore.ObjectsStore[self.ObjId]=self
  428.         
  429.         self.inheritance = 0
  430.         
  431.         if self.Name[0:6] == "Player":
  432.             self.LevelUpParticleData=[]
  433.             for i in range(30):
  434.                 if i>25:
  435.                     traux=(30.0-i)/5.0 #va de 0 a 1
  436.                     aux=traux**0.5
  437.                 else:
  438.                     traux=i/25.0 #va de 1 a 0
  439.                     aux=traux**2.0
  440.                 r=255
  441.                 g=255
  442.                 b=255
  443.                 a=255.0*traux
  444.                 size=200.0*aux
  445.                 self.LevelUpParticleData.append(a)
  446.                 self.LevelUpParticleData.append(size)
  447.                 Bladex.SetParticleGVal("LevelUpParticle",i,r,g,b,a,size)
  448.             Bladex.AddScheduledFunc(Bladex.GetTime()+RestoreEnergyTime, RestoreEnergyFunc,(self.Name,),"PlayerRestoreEnergy")
  449.         
  450.         me=Bladex.GetEntity(self.Name)
  451.         if not me:
  452.             print "PlayerPerson.__setstate__() Warning, can not get entity", self.Name
  453.             return
  454.         
  455.         #_________________________________________#
  456.         # Initialise core                         #
  457.         #_________________________________________#        
  458.         me.AddAnmEventFunc("TakeArrow", Actions.TakeArrowEventHandler)
  459.         me.AddAnmEventFunc("CheckRefireBow", Actions.CheckRefireBowEventHandler)
  460.  
  461.         me.AddAnmEventFunc("W2hToLeft", Actions.W2hToLeftHandler)
  462.         me.AddAnmEventFunc("W2hToRight", Actions.W2hToRightHandler)
  463.         me.AddAnmEventFunc("LaunchTrail", self.LaunchTrail)
  464.         me.AddAnmEventFunc("Start_Weapon", Actions.Start_Weapon)
  465.         me.AddAnmEventFunc("Stop_Weapon", Actions.Stop_Weapon)
  466.         me.AddAnmEventFunc("Start_Trail", Actions.Start_Trail)
  467.         me.AddAnmEventFunc("Stop_Trail", Actions.Stop_Trail)
  468.         me.AddAnmEventFunc("Start_Weapon_Special", Actions.Start_Weapon_Special)
  469.         me.AddAnmEventFunc("Stop_Weapon_Special", Actions.Stop_Weapon_Special)
  470.         me.AddAnmEventFunc("ElevatorDeath", Actions.QuickDeath)
  471.  
  472.         if me.CharTypeExt in ("Kgt", "Bar", "Amz", "Dwf"):
  473.             exec_string="CombosFX."+me.CharTypeExt+"CombosFX(me.Name)"
  474.             exec(exec_string)
  475.  
  476.         me.MutilateFunc= self.MutilateFunc
  477.  
  478.         self.NoFXOnHit= 1
  479.         self.ResetSounds(self.Name)
  480.  
  481.     #_________________________________________#
  482.     # Define our functions                    #
  483.     #_________________________________________#    
  484.     def MutilateFunc(self,EntityName,obj_name,x,y,z,nx,ny,nz,node):
  485.         print EntityName+": MutilateFunc"
  486.         me = Bladex.GetEntity(EntityName)
  487.         if me and me.Kind!="Skeleton":
  488.             Blood.Mutilate (EntityName,obj_name,x,y,z,nx,ny,nz,node)
  489.         limb= Bladex.GetEntity(obj_name)
  490.         InitDataField.Initialise(limb)
  491.         limb.Data.NoFXOnHit= 1
  492.         print limb.Mass, node
  493.         if limb.Mass > 1.5 and limb.Mass < 7.0:
  494.             Reference.EntitiesSelectionData[obj_name]= Reference.DefaultSelectionData["Limb"]
  495.             Reference.EntitiesObjectData[obj_name]= Reference.DefaultObjectData['Limb']
  496.  
  497.     def TakeFunc (self, MyName):
  498.         Actions.StdUse (MyName)
  499.  
  500.     def ThrowFunc (self, MyName):
  501.         Actions.StdThrowObject (MyName)
  502.  
  503.     def HitFunc (self, EntityName, WeaponName, Cx, Cy, Cz, Px, Py, Pz, WeaponCx, WeaponCy, WeaponCz,WeaponDx, WeaponDy, WeaponDz):
  504.         if self.TakeBleedingImpact:            
  505.             Blood.BleedingImpact(Bladex.GetEntity(EntityName), Cx, Cy, Cz, Px, Py, Pz,Bladex.GetEntity(WeaponName),WeaponCx, WeaponCy, WeaponCz,WeaponDx, WeaponDy, WeaponDz)
  506.             self.TakeBleedingImpact= 0
  507.             #print "BloodImpact"
  508.         #else:
  509.             #print "NoBloodImpact"
  510.     
  511.     def ReSpawn (self, EntityName):        
  512.         print "Respawn Func"
  513.         me = Bladex.GetEntity(EntityName)
  514.         
  515.         right= me.InvRight
  516.         left= me.InvLeft
  517.         rightback= me.InvRightBack
  518.         leftback= me.InvLeftBack
  519.         
  520.         self.UnlinkAll (EntityName, "")  # Dettatch arrows        
  521.         
  522.         inv= me.GetInventory()
  523.         # Right Back
  524.         if rightback:
  525.             inv.LinkRightHand (rightback)
  526.             inv.LinkBack(rightback)        
  527.         # Left Back
  528.         if leftback:
  529.             inv.LinkLeftHand (leftback)
  530.             inv.LinkBack(leftback)
  531.         # Right hand        
  532.         if right:
  533.             inv.LinkRightHand (right)
  534.         # Left hand
  535.         if left:
  536.             inv.LinkLeftHand (left)
  537.         
  538.         me.Life= CharStats.GetCharMaxLife(me.Kind, me.Level)
  539.         me.Energy= CharStats.GetCharMaxEnergy(me.Kind, me.Level)
  540.         me.ResetWounds()
  541.                 
  542.         if self.Poisoned:
  543.             self.UnVenom ()
  544.         
  545.         x,y,z= me.Position
  546.         import darfuncs
  547.         darfuncs.CleanArea(x,y,z, 5000.0)
  548.         
  549.         # Link camera
  550.         if(netgame.GetNetState()==0):
  551.             Bladex.AddScheduledFunc(Bladex.GetTime()+0.2, self.RelinkCamera,(),"RelinkCamera")
  552.         angle= me.Angle
  553.         me.Orientation= (0.0, 3.62407746479e-007, 0.707107365131, -0.707106947899)
  554.         me.Angle= angle
  555.     
  556.     def RelinkCamera(self):
  557.         cam=Bladex.GetEntity("Camera")
  558.         cam.SetPersonView("Player1")
  559.     
  560.     def UnlinkAll (self, EntityName,EventName):        
  561.         me = Bladex.GetEntity(EntityName)
  562.         # Usually done on the last frame of a death animation        
  563.         me.UnlinkChildren()        
  564.         
  565.     def GetResistance(self, DamageType):
  566.         if self.Resistances.has_key(DamageType): resistance= self.Resistances[DamageType]
  567.         else: resistance= 0.0
  568.         resistance= min(max(resistance,0.0),1.0)
  569.         
  570.         # Do we have any items that offer protections aginst this damage
  571.         me=Bladex.GetEntity(self.Name)
  572.         if me:
  573.             inv= me.GetInventory()
  574.             for i in range (inv.nKindObjects):
  575.                 obj_name= inv.GetObject(i)
  576.                 object= Bladex.GetEntity(obj_name)
  577.                 try:
  578.                     if object.Data:
  579.                         if object.Data.Resistances:
  580.                             if object.Data.Resistances.has_key(DamageType):
  581.                                 # Adding 0.5 to 0.5 gives 0.75 !!!
  582.                                 extra_resistance= object.Data.Resistances[DamageType]*(1.0-resistance)
  583.                                 resistance= resistance+extra_resistance
  584.                                 resistance= min(max(resistance,0.0),1.0)
  585.                 except AttributeError: pass        
  586.         return resistance
  587.         
  588.         
  589.     def UnVenom (self):
  590.         self.Poisoned= 0        
  591.         
  592.     def ReVenom (self, EntityName, VenomStrength, TimeRemaining, Frequency, Poisoner):
  593.         if self.Poisoned:
  594.             
  595.             if BInput.GetInputManager().GetInputActionsSet()!= "Default":
  596.                 Bladex.AddScheduledFunc(Bladex.GetTime()+Frequency, self.ReVenom,(EntityName,VenomStrength, TimeRemaining, Frequency, Poisoner),self.Name+"ReVenom")
  597.             else:
  598.                 isServer = netgame.GetNetState()==1
  599.                 NextTimeRemaining= TimeRemaining-Frequency
  600.                         
  601.                 me= Bladex.GetEntity(EntityName)
  602.                 if me and me.Life>0:
  603.                     special_resistance= self.GetResistance('Venom')
  604.                     if special_resistance < 1.0:
  605.                         if NextTimeRemaining>0.0:
  606.                             Bladex.AddScheduledFunc(Bladex.GetTime()+Frequency, self.ReVenom,(EntityName,VenomStrength, NextTimeRemaining, Frequency, Poisoner),self.Name+"ReVenom")
  607.                         else:
  608.                         
  609.                             VenomStrength= VenomStrength*(TimeRemaining/Frequency)
  610.                         
  611.                             # remove this poison source
  612.                             self.Poisoned= self.Poisoned-1
  613.                             if not self.Poisoned:
  614.                                 self.UnVenom ()
  615.                         
  616.                         current_venom_damage= VenomStrength-(VenomStrength*special_resistance)
  617.                         me.Life= me.Life- current_venom_damage
  618.                         if me.Life<=0:
  619.                             if isServer: # Net -> Server
  620.                                 Damage.PlayerHitFunc(me.Name,Poisoner, me.Life, 1)
  621.                                 self.UnVenom ()
  622.                             
  623.                             enemy= Bladex.GetEntity(Poisoner)
  624.                             if enemy:
  625.                                 try: enemy.Data.OnKilledEnemy(EntityName)
  626.                                 except: pass
  627.                     else:
  628.                         self.UnVenom ()
  629.                         
  630.     def EnVenom (self, EntityName, VenomStrength, Poisoner):
  631.         me= Bladex.GetEntity(EntityName)
  632.         if me and me.Life>0:
  633.             # Are we immune to poison?
  634.             special_resistance= self.GetResistance('Venom')
  635.             if special_resistance < 1.0:
  636.                 time=Bladex.GetTime()
  637.                 if not self.Poisoned:
  638.                     # Set message on the health bar if we are "Player1"
  639.                     # visual effect (green flash)
  640.                     aura= Auras.MakeAura (EntityName,0.7,   (55,0.1,1.0,1,0,0), (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  641.                     aura.Data.AddEvent(time+0.2,           (45,1.0,1.0,1,0,0), (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  642.                     aura.Data.AddEvent(time+0.7,           (5,0.1,1.0,1,0,0),  (),(),(2,  0.0,0.35,0.0, 0.2, 0.0  , 0.0,0.35,0.0, 0.1, 1.0))
  643.                 
  644.                 # Add another poison source
  645.                 self.Poisoned= self.Poisoned+1
  646.                 # add a scheduled function to suffer poison damage
  647.                 VenomTime= 60.0
  648.                 Frequency= 5.0
  649.                 Bladex.AddScheduledFunc(time+Frequency, self.ReVenom,(EntityName,VenomStrength, VenomTime, Frequency, Poisoner),self.Name+"ReVenom")
  650.         
  651.     
  652.     def LaunchTrail (self, EntityName,EventName):
  653.         me = Bladex.GetEntity(EntityName)
  654.         if me and me.InvRight:
  655.             x, y, z= me.Rel2AbsPoint(1000.0, 0.0, 0.0)
  656.             trail= ItemTypes.MakeHalfmoonTrail (EntityName+"Trail", x,y,z,EntityName)
  657.             trail.Data.ThrowReleaseEventHandler (EntityName,"")
  658.                 
  659.     def FreezeAnmEnd(self,EntityName):
  660.         Bladex.GetEntity(EntityName).Freeze()
  661.     
  662.     def PCImDead (self, EntityName):
  663.         me = Bladex.GetEntity(EntityName)
  664.         me.AddAnmEventFunc("UnlinkAll", self.UnlinkAll)
  665.  
  666.         already_death=0
  667.         Damage.DropInvalidObjectsOnImpact(EntityName)
  668.         anim_name=me.AnimName
  669.         if (anim_name[0]=="D" or anim_name[0]=="d") and (anim_name[1]=="T" or anim_name[1]=="t") and (anim_name[2]=="H" or anim_name[2]=="h"):
  670.             already_death=1
  671.             #print "Already death!"
  672.  
  673.         if already_death==0:
  674.             death_anim="dth0"
  675.             if me.MutilationsMask==2:
  676.                 dth_prob=whrandom.uniform(0.0, 1.0)
  677.                 if (dth_prob<0.142):
  678.                     death_anim="dth_c1"
  679.                 elif (dth_prob<0.286):
  680.                     death_anim="dth_c2"
  681.                 elif (dth_prob<0.428):
  682.                     death_anim="dth_c3"
  683.                 elif (dth_prob<0.571):
  684.                     death_anim="dth_c4"
  685.                 elif (dth_prob<0.714):
  686.                     death_anim="dth_c5"
  687.                 elif (dth_prob<0.857):
  688.                     death_anim="dth_c6"
  689.                 else:
  690.                     death_anim="dth_c7"
  691.             else:
  692.                 dth_prob=whrandom.uniform(0.0, 1.0)
  693.                 #if self.LastDamageType=="Fire":
  694.                 #    death_anim="dth_burn"
  695.                 #el
  696.                 if (dth_prob<0.142):
  697.                     death_anim="dth_n00"
  698.                 elif (dth_prob<0.286):
  699.                     death_anim="dth_n01"
  700.                 elif (dth_prob<0.428):
  701.                     death_anim="dth_n02"
  702.                 elif (dth_prob<0.571):
  703.                     death_anim="dth_n03"
  704.                 elif (dth_prob<0.714):
  705.                     death_anim="dth_n04"
  706.                 elif (dth_prob<0.857):
  707.                     death_anim="dth_n05"
  708.                 else:
  709.                     death_anim="dth_n06"
  710.  
  711.             me.Wuea=Reference.WUEA_ENDED
  712.             launch_new=1
  713.             #print "Dth_Anim " + death_anim + " has Rsteps " + str(Bladex.AnmTypeRSteps(EntityName,death_anim)) + " and Lsteps " +str(Bladex.AnmTypeLSteps(EntityName,death_anim))
  714.             if (me.MutilationsMask==512 or me.MutilationsMask==256) and Bladex.AnmTypeRSteps(EntityName,death_anim)>1:
  715.                 #print "No dth due to not having right leg!"
  716.                 launch_new=0
  717.             elif (me.MutilationsMask==128 or me.MutilationsMask==64) and Bladex.AnmTypeLSteps(EntityName,death_anim)>1:
  718.                 #print "No dth due to not having left leg!"
  719.                 launch_new=0
  720.  
  721.             if launch_new==1:
  722.                 me.LaunchAnmType(death_anim)
  723.  
  724.             if me.AnimName<>death_anim:
  725.                 me.LaunchAnmType("dth0")
  726.                 if me.AnimName<>"dth0":
  727.                     #pdb.set_trace()
  728.                     print "BUG? -> Basdic_Funcs.py , def PCImDead()"
  729.  
  730.         if self.NPC:
  731.             return
  732.         
  733.         # unlink the camera
  734.         cam=Bladex.GetEntity("Camera")
  735.         if EntityName==cam.ETarget:
  736.             cam.SType=0
  737.             cam.TType=2
  738.             cam.ETarget='Player1'
  739.  
  740.         #Do NOT respawn in demo_mode
  741.         if netgame.GetNetState()==0:
  742.             if Reference.DEMO_MODE==0:
  743.                 if (not self.NPC): # "and 0" by Dario (don't killme please)
  744.                     if Reference.PYTHON_DEBUG >= 2:
  745.                         if me.Wuea==Reference.WUEA_ENDED:
  746.                             print "Respawning now!, no death anim"
  747.                             self.ReSpawn(EntityName)
  748.                         else:
  749.                             #print "Respawning after anim ends"
  750.                             me.AnmEndedFunc= self.ReSpawn
  751.                     else:
  752.                         import SaveGame
  753.                         
  754.                         # DROP WEAPONS
  755.                         try:
  756.                             object = Bladex.GetEntity(me.InvLeft)
  757.                             if me.InvLeft and object and not object.TestHit:
  758.                                 Actions.RemoveFromInventory (me, object,"DropLeftEvent")
  759.                                 object.Impulse(0.0, 0.0, 0.0) 
  760.                         except AttributeError: 
  761.                             pdb.set_trace()
  762.                         
  763.                         try:
  764.                             object = Bladex.GetEntity(me.InvRight)
  765.                             if me.InvRight and object and not object.TestHit:
  766.                                 Actions.RemoveFromInventory (me, object,"DropRightEvent")
  767.                                 object.Impulse(0.0, 0.0, 0.0) 
  768.                         except AttributeError: 
  769.                             pdb.set_trace()
  770.                         
  771.                         # Call the Load Menu
  772.                         if me.Wuea==Reference.WUEA_ENDED:
  773.                             print "no death anim... So Fade an go!"
  774.                             SaveGame.MenuStart(EntityName)
  775.                         else:
  776.                             #print "after anim ends the menu will be true.."
  777.                             me.AnmEndedFunc= SaveGame.MenuStart
  778.             else:
  779.                 if not self.NPC: # "and 0" by Dario (don't killme please)
  780.                     Bladex.AddScheduledFunc(Bladex.GetTime()+5.0, Bladex.LoadLevel,(Bladex.GetCurrentMap(),),"ReloadAfterDeath")
  781.         else:
  782.             me.AnmEndedFunc= self.FreezeAnmEnd
  783.  
  784.  
  785.     def OnKilledEnemy(self,KilledEntityName):
  786.         Reference.debugprint("OnKilledEnemy")
  787.         KilledEntity=Bladex.GetEntity(KilledEntityName)
  788.         if KilledEntity is None:
  789.             print "OnKilledEnemy(): Error: None Entity"
  790.             return
  791.         me=Bladex.GetEntity(self.Name)
  792.         #import CharStats # Necesario para la recarga de partida. ┐Paron?
  793.         me.PartialLevel=me.PartialLevel+CharStats.GetCharExperienceReward(KilledEntity.CharType,KilledEntity.Level)
  794.  
  795.         LevelLimit=CharStats.GetCharExperienceCost(me.CharType,me.Level)
  796.  
  797.         if self.Name=="Player1":  #REVISAR
  798.             import Scorer
  799.             # Ahora compruebo si sube de nivel
  800.             if me.PartialLevel>=LevelLimit:
  801.                 me.PartialLevel=me.PartialLevel-LevelLimit
  802.                 me.Level=me.Level+1
  803.                 Scorer.LevelUp()
  804.                 Scorer.SetLevelLimits(0,CharStats.GetCharExperienceCost(me.CharType,me.Level))
  805.                 maxsize=40+5*me.Level # 40->190
  806.                 maxPPS=60+22*me.Level # 60->720
  807.                 maxint=0.2+0.15*me.Level # 0.2->4.7
  808.                 AuraParams=(5, 0, 1, 0, 0, 1)
  809.                 AuraGradient=(2, 0.4, 0.6, 1.0, 0.5, 0.0, 0.1, 0.2, 1.0, 0.0, 0.8)
  810.                 AuraVar1Args=(5, maxsize, 0, 1, 0.5)
  811.                 AuraVar2Args=(maxsize, 5, 1, 0, 1.0)
  812.                 PSParams=(self.LevelUpParticleData, "LevelUpParticle", 30, 50, 150, 255, maxPPS, -600, 0.0, 2, 2, 0.4, 30, 0.5)
  813.                 GenFX.LevelUpFX("Player1", 0, AuraParams, AuraGradient, AuraVar1Args, AuraVar2Args, PSParams, maxint, "Timer15", 15, "..\\..\\Sounds\\aparicion-escudo.wav")
  814.                 
  815.                 # Restore state of the player.
  816.                 if me.Life >0: # If an enemy death by poison or trowed weapons and.. You are death!
  817.                     me.ResetWounds()
  818.                     me.Life = CharStats.GetCharMaxLife(me.Kind, me.Level)
  819.                 
  820.                 Scorer.SlideTBS(0)
  821.                 Scorer.LevelUpFlash()
  822.  
  823.             if netgame.GetNetState() == 0:
  824.                 Scorer.SetLevelBarValue(me.PartialLevel)
  825. #        else:
  826. #            # Ahora compruebo si sube de nivel
  827. #            if me.PartialLevel>LevelLimit:
  828. #                me.PartialLevel=me.PartialLevel-LevelLimit
  829. #                me.Level=me.Level+1
  830.  
  831.  
  832.  
  833.     # Launch animations in response to being hit.  Called internally in Python from the damage func
  834.     # These animations are for a standard human skeleton.  Replace this func for other race types.
  835.     def RespondToHit(self, EntityName, AttackerName, DamagePoints, DamageType, DamageZone, Shielded):
  836.         me = Bladex.GetEntity(EntityName)
  837.         
  838.         weapon_flag=Reference.W_FLAG_1H
  839.         if me.InvRight:
  840.             weapon_flag=Reference.GiveWeaponFlag(me.InvRight)
  841.  
  842.         if DamagePoints<=0 and Shielded and me.GetInventory().GetMagicShield():
  843.             return
  844.         if me and me.Life > 0:
  845.             damage_factor = DamagePoints / (me.Life+DamagePoints)
  846.  
  847.             if damage_factor > me.Data.DamageFactorNone:
  848.                 if DamageZone >= 0 and DamageZone < 32:
  849.                     me.SetWoundedZone(DamageZone, 1)
  850.  
  851.                 do_not_abort=0
  852.                 if me.AnimName == "df_s_broken" or me.AnimName == "sword_broken":
  853.                     do_not_abort=1
  854.                 if do_not_abort==0:
  855.                     
  856.                     Damage.DropInvalidObjectsOnImpact (EntityName)
  857.                     me.Wuea=Reference.WUEA_ENDED
  858.     
  859.                     if me.InCombat:
  860.                         me.InterruptCombat()
  861.                         if Shielded:
  862.                             # Launch Blocking damage animations
  863.                             if damage_factor <= (me.Data.DamageFactorLight+me.Data.DamageFactorHeavy) / 2.0:
  864.                                 Reference.debugprint("Launching .df_01")
  865.                                 if weapon_flag==Reference.W_FLAG_2W:
  866.                                     me.LaunchAnmType("df_01_2w")
  867.                                 elif weapon_flag==Reference.W_FLAG_AXE:
  868.                                     me.LaunchAnmType("df_01_axe")
  869.                                 elif weapon_flag==Reference.W_FLAG_SP:
  870.                                     me.LaunchAnmType("df_01_spear")
  871.                                 else:
  872.                                     me.LaunchAnmType("df_01")
  873.                             else:
  874.                                 Reference.debugprint("Launching .df_02")
  875.                                 if weapon_flag==Reference.W_FLAG_2W:
  876.                                     me.LaunchAnmType("df_02_2w")
  877.                                 elif weapon_flag==Reference.W_FLAG_AXE:
  878.                                     me.LaunchAnmType("df_02_axe")
  879.                                 elif weapon_flag==Reference.W_FLAG_SP:
  880.                                     me.LaunchAnmType("df_02_spear")
  881.                                 else:
  882.                                     me.LaunchAnmType("df_02")
  883.                         else:
  884.                             if damage_factor <= me.Data.DamageFactorLight:    
  885.                                 Reference.debugprint("Launching .hurt_f_lite")
  886.                                 me.LaunchAnmType("hurt_f_lite")
  887.                             elif damage_factor >= me.Data.DamageFactorHeavy:
  888.                                 Reference.debugprint("Launching .hurt_f_big")
  889.                                 me.LaunchAnmType("hurt_f_big")
  890.                             elif DamageZone==Reference.BODY_HEAD:
  891.                                 Reference.debugprint("Launching .hurt_f_head")
  892.                                 me.LaunchAnmType("hurt_f_head")
  893.                             elif DamageZone==Reference.BODY_FRONT:
  894.                                 Reference.debugprint("Launching .hurt_f_breast")
  895.                                 me.LaunchAnmType("hurt_f_breast")
  896.                             elif DamageZone==Reference.BODY_BACK:
  897.                                 Reference.debugprint("Launching .hurt_f_back")
  898.                                 me.LaunchAnmType("hurt_f_back")
  899.                             elif DamageZone==Reference.BODY_RARM or DamageZone==Reference.BODY_RHAND:
  900.                                 Reference.debugprint("Launching .hurt_f_r_arm")
  901.                                 me.LaunchAnmType("hurt_f_r_arm")
  902.                             elif DamageZone==Reference.BODY_LARM or DamageZone==Reference.BODY_LHAND:
  903.                                 Reference.debugprint("Launching .hurt_f_l_arm")
  904.                                 me.LaunchAnmType("hurt_f_l_arm")
  905.                             elif DamageZone==Reference.BODY_RLEG or DamageZone==Reference.BODY_RFOOT:
  906.                                 Reference.debugprint("Launching .hurt_f_r_leg")
  907.                                 me.LaunchAnmType("hurt_f_r_leg")
  908.                             elif DamageZone==Reference.BODY_LLEG or DamageZone==Reference.BODY_LFOOT:
  909.                                 Reference.debugprint("Launching .hurt_f_l_leg")
  910.                                 me.LaunchAnmType("hurt_f_l_leg")
  911.                     else:
  912.                         if me.Run:
  913.                             Reference.debugprint("Launching .hurt_jog")
  914.                             me.LaunchAnmType("hurt_jog")
  915.                         else:
  916.                             if Shielded:
  917.                                 # Launch Blocking damage animations
  918.                                 if damage_factor <= (me.Data.DamageFactorLight+me.Data.DamageFactorHeavy) / 2.0:
  919.                                     Reference.debugprint("Launching .df_01")
  920.                                     if weapon_flag==Reference.W_FLAG_2W:
  921.                                         me.LaunchAnmType("df_01_2w")
  922.                                     elif weapon_flag==Reference.W_FLAG_AXE:
  923.                                         me.LaunchAnmType("df_01_axe")
  924.                                     elif weapon_flag==Reference.W_FLAG_SP:
  925.                                         me.LaunchAnmType("df_01_spear")
  926.                                     else:
  927.                                         me.LaunchAnmType("df_01")
  928.                                 else:
  929.                                     Reference.debugprint("Launching .df_02")
  930.                                     if weapon_flag==Reference.W_FLAG_2W:
  931.                                         me.LaunchAnmType("df_02_2w")
  932.                                     elif weapon_flag==Reference.W_FLAG_AXE:
  933.                                         me.LaunchAnmType("df_02_axe")
  934.                                     elif weapon_flag==Reference.W_FLAG_SP:
  935.                                         me.LaunchAnmType("df_02_spear")
  936.                                     else:
  937.                                         me.LaunchAnmType("df_02")
  938.                             elif DamageZone==Reference.BODY_HEAD:
  939.                                 Reference.debugprint("Launching .hurt_head")
  940.                                 me.LaunchAnmType("hurt_head")
  941.                             elif DamageZone==Reference.BODY_FRONT:
  942.                                 Reference.debugprint("Launching .hurt_breast")
  943.                                 me.LaunchAnmType("hurt_breast")
  944.                             elif DamageZone==Reference.BODY_BACK:
  945.                                 Reference.debugprint("Launching .hurt_back")
  946.                                 me.LaunchAnmType("hurt_back")
  947.                             elif DamageZone==Reference.BODY_RARM or DamageZone==Reference.BODY_RHAND:
  948.                                 Reference.debugprint("Launching .hurt_r_arm")
  949.                                 me.LaunchAnmType("hurt_r_arm")
  950.                             elif DamageZone==Reference.BODY_LARM or DamageZone==Reference.BODY_LHAND:
  951.                                 Reference.debugprint("Launching .hurt_l_arm")
  952.                                 me.LaunchAnmType("hurt_l_arm")
  953.                             elif DamageZone==Reference.BODY_RLEG or DamageZone==Reference.BODY_RFOOT:
  954.                                 Reference.debugprint("Launching .hurt_r_leg")
  955.                                 me.LaunchAnmType("hurt_r_leg")
  956.                             elif DamageZone==Reference.BODY_LLEG or DamageZone==Reference.BODY_LFOOT:
  957.                                 Reference.debugprint("Launching .hurt_l_leg")
  958.                                 me.LaunchAnmType("hurt_l_leg")
  959.                             else:
  960.                                 # Shouldn't get here
  961.                                 #pdb.set_trace()
  962.                                 pass
  963.  
  964.  
  965.     #
  966.     # Standatd function for printing ...
  967.     #
  968.     def StdNewCombo(self,EntityName,ComboName):
  969.         if netgame.GetNetState() == 0:
  970.             import GameText
  971.             
  972.             me = Bladex.GetEntity(EntityName)
  973.             if EntityName<>"Player1":
  974.                 return
  975.             
  976.             ComboTXT = GameText.GetComboName(EntityName,ComboName)
  977.             if ComboTXT:    
  978.                 GameText.WriteTextAux(MenuText.GetMenuText("New Attack")+": "+ ComboTXT,2.0,255,255,255,[])
  979.                 
  980.                 new_combo_sound.Stop()
  981.                 #new_combo_sound.Play(me.Position[0],me.Position[1],me.Position[2],0);
  982.                 new_combo_sound.PlayStereo()
  983.  
  984.  
  985.  
  986.     def StdBigFall(self,EntityName,Dist):
  987.         me = Bladex.GetEntity(EntityName)
  988.         chartype = Bladex.GetCharType(me.CharType,me.CharTypeExt)
  989.  
  990.         if Dist>=chartype.DieFall:
  991.             return
  992.         if Dist<5000:
  993.             return
  994.  
  995.         diff=(Dist-5000.0)*0.001
  996.         fall_damage=((Dist-5000.0)/(chartype.DieFall-5000))*70.0
  997.         
  998.         me.Life=me.Life-fall_damage
  999.         if netgame.GetNetState()==1: # juego de red -> servidor 
  1000.             if me.Life <=0:
  1001.                 Damage.PlayerHitFunc(me.Name,"Fall", me.Life, 1)
  1002.  
  1003.  
  1004.     #def StdToggleCombat(self,EntityName):
  1005.     #    import DMusic
  1006.     #    #print "Hola! Toggle Combat"
  1007.     #    me = Bladex.GetEntity(EntityName)
  1008.     #    if self.NPC==1:
  1009.     #        DMusic.notifyCombat(EntityName)
  1010.  
  1011.     def RegisterObjectAsTaken(self, ObjectName):
  1012.         object= Bladex.GetEntity(ObjectName)
  1013.         if object:
  1014.             kind= object.Kind
  1015.             if not self.ObjectsTaken.count(kind):
  1016.                 self.ObjectsTaken.append(kind)
  1017.     
  1018.     def WasObjectAlreadyTaken(self, ObjectName):
  1019.         object= Bladex.GetEntity(ObjectName)
  1020.         if object:
  1021.             kind= object.Kind
  1022.             return self.ObjectsTaken.count(kind)
  1023.             
  1024.     def GetObjectsTaken (self):
  1025.         return self.ObjectsTaken
  1026.